Oracle数据库之表空间(tablespace)

您所在的位置:网站首页 tablespace users logging含义 Oracle数据库之表空间(tablespace)

Oracle数据库之表空间(tablespace)

2024-07-11 14:35| 来源: 网络整理| 查看: 265

Oracle数据库的江湖地位不用多说,懂得都懂,大型公司基本必备的数据库,没有之一。在咱们国家,虽然有喊口号--去o化,可口号喊得在响亮,身体却很诚实,因此,Oracle也是运维或者开发面试时所需要掌握的基础知识之一。

Oracle数据库的特点是重型的(数据库的方方面面的功能都有所涵盖,比如,快速备份,自动化备份,任务计划,触发器,视图,视图函数,超级细分的角色用户管理系统,内存管理,表空间管理,安全审计等等,但其实各方面的相关配置是有迹可循的,相对于所谓的号称轻型,小巧的软件,那些软件配置起来,可能是天马行空,无从下手的感觉),可快速使用的,在架构方面,可快速组合成集群的一种关系型数据库。那么,既然是关系型数据库,自然有非常多的逻辑(不管内在还是外在),我们需要学习的就是掌握这些逻辑,并在生产中为我们所用。

一,表空间的概念(tablespace)

oarcle数据库真正存放数据的是数据文件(data files),Oarcle表空间(tablespaces)实际上是一个逻辑的概念,他在物理上是并不存在的,那么把一组data files 捻在一起就成为一个表空间。

表空间属性:

1)一个数据库可以包含多个表空间,一个表空间只能属于一个数据库。

2)一个表空间可以包含多个数据文件,一个数据文件只能属于一个表空间。

3)表空间有实际大小,可以理解为Linux的磁盘配额,是一种特殊的具有磁盘配额的文件系统,如果没有设置自动动态调整autoextensiable字段为no,而表空间又被数据占用完毕,那么,数据库的这个表空间将不能保存任何数据。

从逻辑的角度来看,一个数据库(database)下面可以分多个表空间(tablespace);一个表空间下面又可以分多个段(segment);一个数据表要占一个段(segment),一个索引也要占一个段(segment )。 一个段(segment)由多个 区间(extent)组成,那么一个区间又由一组连续的数据块(data block)组成。这连续的数据块是在逻辑上是连续的,有可能在物理磁盘上是分散。

《1》

那么从物理的角度上看,一个表空间由多个数据文件组成,数据文件是实实在在存在的磁盘上的文件。这些文件是由oracle数据库操作系统的block 组成的,通常,文件的后缀名是dbf。

SELECT * FROM DBA_DATA_FILES; 输出如下: C:\APP\ADMINISTRATOR\ORADATA\MYORACLE\USERS01.DBF 4 USERS 5242880 640 AVAILABLE 4 YES 34359721984 4194302 160 4194304 512 ONLINE C:\APP\ADMINISTRATOR\ORADATA\MYORACLE\UNDOTBS01.DBF 3 UNDOTBS1 110100480 13440 AVAILABLE 3 YES 34359721984 4194302 640 109051904 13312 ONLINE C:\APP\ADMINISTRATOR\ORADATA\MYORACLE\SYSAUX01.DBF 2 SYSAUX 545259520 66560 AVAILABLE 2 YES 34359721984 4194302 1280 544210944 66432 ONLINE C:\APP\ADMINISTRATOR\ORADATA\MYORACLE\SYSTEM01.DBF 1 SYSTEM 723517440 88320 AVAILABLE 1 YES 34359721984 4194302 1280 722468864 88192 SYSTEM C:\APP\ADMINISTRATOR\ORADATA\MYORACLE\EXAMPLE01.DBF 5 EXAMPLE 104857600 12800 AVAILABLE 5 YES 34359721984 4194302 80 103809024 12672 ONLINE

autoextensiable字段yes表示该文件会动态的调整大小。可以看到,目前,我的这个数据库有5个表空间,名称为users,undotbs1,sysaux,system,example。

《2》

查询所有的现有的表空间的大小以及使用率:

SELECT a.tablespace_name, a.bytes total, b.bytes used, c.bytes free, (b.bytes * 100) / a.bytes "% USED ", (c.bytes * 100) / a.bytes "% FREE " FROM sys.sm$ts_avail a, sys.sm$ts_used b, sys.sm$ts_free c WHERE a.tablespace_name = b.tablespace_name AND a.tablespace_name = c.tablespace_name;

 

以上输出的单位为bytes,可以看到,sysaux表空间大致的总大小(可以理解为总配额)为550m,system表空间大致的总大小(可以理解为总配额)为720m。下图可以看到实际的物理文件大小比查询的略小,但基本接近(估算的,因此有差异)。

《4》

查询表空间剩余的使用容量:

SELECT tablespace_name, file_id, file_name, round(bytes / (1024 * 1024), 0) total_space FROM dba_data_files ORDER BY tablespace_name; select tablespace_name from dba_data_files; SELECT SUM(bytes) / (1024 * 1024) AS free_space, tablespace_name FROM dba_free_space GROUP BY tablespace_name;

 

以上的单位为M,sysaux剩余配额为28.9m,system剩余配额为5.3m。当然了,在实际生产中,我们对这些无须在意,因为,前面也查询出了,表空间会autoextensiable,也就是表空间配额用完了,Oracle会自动给增加的。只要你的物理硬盘剩余空间足够多,它会不断的自动增加。

《5》

查询oracle数据库的关于db(数据库)的参数:

show parameter db; 输出如下: NAME TYPE VALUE ----------------------------- ----------- ---------------------------------------- db_16k_cache_size big integer 0 db_2k_cache_size big integer 0 db_32k_cache_size big integer 0 db_4k_cache_size big integer 0 db_8k_cache_size big integer 0 db_block_buffers integer 0 db_block_checking string FALSE db_block_checksum string TYPICAL db_block_size integer 8192 db_cache_advice string ON db_cache_size big integer 0 db_create_file_dest string db_create_online_log_dest_1 string db_create_online_log_dest_2 string db_create_online_log_dest_3 string db_create_online_log_dest_4 string db_create_online_log_dest_5 string db_domain string db_file_multiblock_read_count integer 128 db_file_name_convert string db_files integer 200 db_flash_cache_file string db_flash_cache_size big integer 0 db_flashback_retention_target integer 1440 db_keep_cache_size big integer 0 db_lost_write_protect string NONE db_name string myoracle db_recovery_file_dest string C:\app\Administrator\flash_recovery_area db_recovery_file_dest_size big integer 3912M db_recycle_cache_size big integer 0 db_securefile string PERMITTED db_ultra_safe string OFF db_unique_name string myoracle db_writer_processes integer 1 dbwr_io_slaves integer 0 rdbms_server_dn string standby_archive_dest string %ORACLE_HOME%\RDBMS standby_file_management string MANUAL xml_db_events string enable

那么,我这个Oracle数据库使用的block是默认的8192,数据库名称是myoracle。

Segment(段) :段是指占用数据文件空间的通称,或数据库对象使用的空间的集合;段可以有表段、索引段、回滚段、临时段和高速缓存段等。

Extent (区间):分配给对象(如表)的任何连续块叫区间;区间也叫扩展,因为当它用完已经分配的区间后,再有新的记录插入就必须在分配新的区间(即扩展一些块);一旦区间分配给某个对象(表、索引及簇),则该区间就不能再分配给其它的对象.

二,新建表空间

这里的新建表空间,也就是新建表空间的对应文件,SQL语句如下:

create  tablespace test datafile 'C:\app\Administrator\oradata\myoracle\test02.dbf' size 200m;

表示新建一个200m大小的表空间名称为test,当然,这个表空间没有自增长,也没有最大限制。

create  tablespace test datafile 'C:\app\Administrator\oradata\myoracle\test02.dbf' size 200m autoextend on next 50m maxsize 20480m extent management local;

这条SQL语句表示新建一个名称为test,初始大小为200m的表空间,并且每次自增为50m,最多增加到20480m也就是20g。

三,删除表空间

删除表空间语句为:

alter database datafile 'C:\app\Administrator\oradata\myoracle\test02.dbf' offline; 这里需要注意,必须是归档模式才可以offline,如果不是归档模式,需要执行以下命令(使用SQLplus,登录sys用户以sysdba权限执行以下命令):

start database nomount;

alter database mount;

alter database archivelog;

alter database open;

archive log list;

确保是存档模式,才可以执行alter database datafile 'C:\app\Administrator\oradata\myoracle\test02.dbf' offline;否则会报错:

错误报告 - SQL 错误: ORA-01145: 除非启用了介质恢复, 否则不允许立即脱机 01145. 00000 - "offline immediate disallowed unless media recovery enabled" *Cause: ALTER TABLESPACE ... OFFLINE IMMEDIATE or ALTER DATABASE DATAFILE ... OFFLINE is only allowed if database is in ARCHIVELOG mode. *Action: Take tablespace offline normally or shutdown abort. Reconsider your backup strategy. You could do this if you were archiving your logs. ORA-01031: 权限不足

最后执行删除命令:

drop tablespace TEST including CONTENTS and datafiles CASCADE CONSTRAINTS;

删除上例新建的test表空间,上下文以及物理文件以及所有依赖彻底删除。当然,表空间内所建立的所有表,视图等等内容都会跟随删除。

四,表空间的指定使用

create table test(id int) tablespace test;

新建一个表,名称为test,就一个字段id int类型的表,指定使用上述所建立的新表空间。

五,表空间的扩容

很多时候,表空间可能会被大量的短时间内的数据撑爆,比如,我的Oracle的system表空间就已经达到百分之99以上,如果是生产库,那么很显然,很危险了。因此,手动扩容是一个比较好的选择。

增加表空间大小的四种方法 Meathod1:给表空间增加数据文件 ALTER TABLESPACE app_data ADD DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP03.DBF' SIZE 50M;   Meathod2:新增数据文件,并且允许数据文件自动增长 ALTER TABLESPACE app_data ADD DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP04.DBF' SIZE 50M AUTOEXTEND ON NEXT 5M MAXSIZE 100M;   Meathod3:允许已存在的数据文件自动增长 ALTER DATABASE DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP03.DBF' AUTOEXTEND ON NEXT 5M MAXSIZE 100M;   Meathod4:手工改变已存在数据文件的大小 ALTER DATABASE DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP02.DBF' RESIZE 100M; 

扩容SQL语句为:

1,先查询出每个表空间的大小,该语句查询出的结果以m为单位:

select a.tablespace_name,total,free,total-free used from ( select tablespace_name,sum(bytes)/1024/1024 total from dba_data_files group by tablespace_name) a, ( select tablespace_name,sum(bytes)/1024/1024 free from dba_free_space group by tablespace_name) b where a.tablespace_name=b.tablespace_name;

2,本例以给system这个表空间扩容为例.从原始的690m扩容到800m,使用的是第四种方法:

alter database datafile 'C:\APP\ADMINISTRATOR\ORADATA\MYORACLE\SYSTEM01.DBF' resize 800m;



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3